/*
    The NeonX Library

    Copyright (c) 2013 darkcat

    Code covered by the MIT License
*/

#pragma once

// nx...
#include "config/general.h"

//////////////////////////////////////////////////////////////////////////
NX_BEG
//////////////////////////////////////////////////////////////////////////

// Define Stream

template <typename P>
class Stream : public P
{
public:
    typedef P policy_t;

public:
    template <typename T>
    friend const Stream<P>& operator<<(const Stream<P>& s, const T& data)
    {
        const_cast<Stream<P>*>(&s)->_(data);
        return s;
    }
    template <typename T>
    friend const Stream<P>& operator, (const Stream<P>& s, const T& data)
    {
        const_cast<Stream<P>*>(&s)->_(data);
        return s;
    }

    friend const Stream<P>& operator<<(const Stream<P>& s, const Stream<P>& (*func)(const Stream<P>&))
    {
        return func(s);
    }
    friend const Stream<P>& operator, (const Stream<P>& s, const Stream<P>& (*func)(const Stream<P>&))
    {
        return func(s);
    }
};

//////////////////////////////////////////////////////////////////////////
NX_END
//////////////////////////////////////////////////////////////////////////
